package thread;

import java.util.Hashtable;
import java.util.concurrent.ConcurrentHashMap;

/**
 * Creared with IntelliJ IDEA.
 * Description:多线程使用HashMap
 * User:yxd
 * Date:2022-04-02
 * Time:22:19
 */
public class Demo32 {
    public static void main(String[] args) {
        Hashtable hashtable = new Hashtable();//HashTable就是主要给关键方法加锁put,get整体加锁,这样的加锁会使得锁竞争十分激烈,然后效率也会降低,因此HashTable是非常不推荐的

        ConcurrentHashMap<Integer,Integer> map = new ConcurrentHashMap<>();
        //1.ConcurrentHashMap就是将每一个链表的头结点就加上一把锁,锁的竞争就会减小,效率也会提高
        //2.另外ConcurrentHashMap只是针对写操作加锁了,读操作是没有加锁的,只是使用了volatile,避免内存可见性的问题
        //3.ConcurrentHashMap中更广泛的使用了CAS,进一步提高了效率(比如维护size的操作)
        /*4.ConcurrentHashMap针对扩容进行了巧妙的化整为零(如果元素多了,链表长度变长,就会影响哈希表的效率,
        因此就需要扩容,而对于之前的扩容操作就会创建一个更大的数组,把之前旧的元素全部搬运过去,这样的操作是非常耗时的,HashTable就是这样做,
        而ConcurrentHashMap就会每次操作只搬运一点点,通过多次的操作完成整个搬运的过程,会同事维护一个新的HashMap和一个旧的,
        查找的时候急需要查找旧的也要查找新的,插入的时候只插入新的,直到搬运完成之后,就会销毁旧的HashMap) */

    }
}
